package main

import (
	"fmt"
)

func main() {

	// 定义一个 slice  没有给定长度或者 ... 三个点 就是 slice
	var a []int

	fmt.Println(a)

	fmt.Println("==================")

	b := [5]int{1, 2, 3, 4, 5}

	// 将索引为1到索引为 len(b)-1的值  取出
	s1 := b[1:len(b)]

	fmt.Println(s1)

	//将索引为2 取到结尾 的值取出
	s2 := b[2:]

	fmt.Println(s2)

	//使用make定义 切面  定义初始10个大小的int 数组 超过20时自动扩容
	//分配了 长度为20的内存块  超过时 自动重新分配内存块
	s3 := make([]int, 10, 20)

	// 打印长度 和容量
	fmt.Println(len(s3), cap(s3))

	fmt.Println("Slice与底层数组的对应关系========")
	f := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'j', 'h'}

	// 区索引为 2到 4的值（不含4）
	sa := f[2:4] //cde  //就是 sa指向了 f数组的 部分连续内存块
	//f[0] = 'h'
	//f[2] = 'h'                    //修改索引为2的值  sa切面的值 也自动变换
	fmt.Println(len(sa), cap(sa)) //长度是2 容量是9
	fmt.Println(string(sa))

	fmt.Println(f)

	// ReSlice  在切片的基础上 在切片
	fmt.Println("在切片")
	sb := sa[0:2]
	fmt.Println(string(sb))

	//在 切片上追加元素

	fmt.Println("在切片上 追加元素")

	s4 := make([]int, 3, 6)
	fmt.Printf("%p\n", s4) //打印地址

	s4 = append(s4, 5, 6, 5) //追加三个元素

	/*在切片
	cd
	在切片上 追加元素
	0xc00000c450
	[0 0 0 5 6 5] 0xc00000c450*/

	fmt.Printf("%v %p\n", s4, s4)

}
